* Version 0.7.1 *

			INSTALL:


* Make backups of:
  source/include/Irrlicht.h
  source/include/IAnimatedMesh.h
  source/include/IAnimatedMeshSceneNode.h
  source/CAnimatedMeshSceneNode.h
  source/CAnimatedMeshSceneNode.cpp

* Where to extract the files:
    into your irrlicht/source folder:
	CMD3MeshFileLoader.h
	CAnimatedMeshMD3.*
	CAnimatedMeshSceneNode.*
	CSceneManager.*
	dllwrapdx_mmx.bat
    into your irrlicht/source/include folder:
	IAnimatedMeshSceneNode.h
	irrlicht.h
	IAnimatedMeshMD3.h
	IAnimatedMesh.h
    into your irrlicht/bin/DevCpp folder:
	Irrlicht.dll
    into your irrlicht/lib/DevCpp folder:
	libIrrlicht.*

* Eventually, copy the files from the irrlicht/source/include folder
  to your irrlicht/include folder as well.

* As a general rule, file beginning with "I" should be copied into the
  "source/include" (and eventually "irrlicht/include") folder, while the
  ones beginning with "C" have to be copied into the "source" folder.

* Open your irrlicht project ("Irrlicht.dev" for Dev-C++; "Irrlicht.dsp" for
  VisualStudio) and add the following files to the project:
  CMD3MeshFileLoader.h
  CMD3MeshFileLoader.cpp
  CAnimatedMeshMD3.h
  CAnimatedMeshMD3.cpp


* Important note for Dev-C++/mingw users:
  dllwrap should give you error 255 (Input line too long) when compiling.
  To solve this, just compile without linking, then open a dos window and
  go to the source directory. Here launch the dllwrapdx_???.bat included
  in this zip file, and all should link correctly.
  From this version, different batch files are provided for different
  hardware optimizations.
  Use:
	dllwrapdx_mmx for MMX processors
	dllwrapdx_3dnow for 3DNow! processors (AMD)
	dllwrapdx_sse for SSE processors (Pentium III...)
	dllwrapdx_sse2 for SSE2 processors (Pentium 4...)




			USE:

It will work like any other mesh loader, i.e.:
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode (
	smgr->getMesh ("../myfile.md3") );




		CHANGES TO ORIGINAL IRRLICHT FILES:

* in IAnimatedMesh.h:
    -In the enum EANIMATED_MESH_TYPE added:
 ...
        //! Quake 3 .md3 model file
        EAMT_MD3
 ...




* In IAnimatedMeshScenenode.h
   -Added declaration of getMD3TagNode () public method

   -Added declaration of addAnimation (), setAnimation () and linkAnimation () public methods




* In CAnimatedMeshSceneNode.h
   -Added declaration of getMD3TagNode () public method

   -Added private array of dummy transformation nodes: TagChildSceneNodes

   -Added declaration of addAnimation (), setAnimation () and linkAnimation () public methods




* In CAnimatedMeshSceneNode.cpp
   -In the includes added:
	#include "IAnimatedMeshMD3.h"

   -In destructor:
	Added code to deallocate TagChildSceneNodes

   -In OnPreRender () method:
	Added code for TagChildSceneNodes prerender

   -In OnPostRender () method:
	Added code to update tag nodes

   -In removeChild () method:
	Added code to remove tag children

   -Implemented getMD3TagNode

   -Implemented addAnimation, setAnimation and linkAnimation public methods



* In Irrlicht.h:
 ...
	#include "IAnimatedMeshMD3.h"
 ...




* In CSceneManager.cpp;
    -In the includes:
 ...
	#include "CMD3MeshFileLoader.h"
 ...

    -In the constructor:
 ...
	MeshLoaderList.push_back(new CMD3MeshFileLoader(FileSystem, Driver));
 ...



* NEW - The setWindowIcon method was removed from the IrrlichtDevice class, because it is
	now useless. To set an icon (under windows, of course), include windows.h and use
	a code like this:

        HWND HWnd = reinterpret_cast<HWND>(myVideoDriver->getExposedVideoData ().D3D9.HWnd); // or ...D3D8.HWnd
        HANDLE iconHandle = LoadImage(0, "IconFile.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE | LR_LOADTRANSPARENT);
        SendMessageW (HWnd, WM_SETICON, ICON_BIG, (LPARAM)iconHandle);
        SendMessageW (HWnd, WM_SETICON, ICON_SMALL, (LPARAM)iconHandle);



		SPECIAL MD3 FUNCTIONS:

New public method of IAnimatedMeshSceneNode (implemented in CAnimatedMeshSceneNode):

*	ISceneNode* getMD3TagNode (const c8* tagName)

	This works similarly to getMS3DJointNode, returning a pointer to a scenenode
	wich has the same transformation of the corresponding tag. Obviously, this
	works only if the mesh is of EAMT_MD3 type.


New CAnimatedMeshMD3 public methods:

*	core::vector3df getTagOrigin (const char* Name)
*	core::vector3df getTagOrigin (s32 Number)
	Return the vector containing X, Y, Z origin for the tag.

*	const core::vector3df* getTagRotation (const char* Name)
*	const core::vector3df* getTagRotation (s32 Number)
	Return a 3x3 matrix containing tag orientation values. Useful along with
	getTagOrigin to build the tag transformation matrix.

*	const c8* getTagName (s32 Number)
	Self explaining =P

*	core::matrix4* getMatrixOfTags (s32 tagNumber, s32 frame = -1)
	Similar to MS3D's getMatrixOfJoints, only this works for MD3 tags.


		LINKED ANIMATIONS

This feature is useful when a model has to perform an animation without a loop. For example,
a character performing an attack animation should switch to the standing animation after the
last frame of the attack animation.
For this purpose all animated mesh scenenodes now have three new methods:
*	s32 addAnimation (u16 firstFrame, u16 lastFrame, u8 FPS)
*	bool setAnimation (u16 animIdx)
*	bool linkAnimation (u16 anim, u16 linkedAnim)
The best way to describe how do they work is giving a typical example.
Let's say our model has three animations:
-Stand	from frame 0 to frame 16, at 14 frames per second
-Walk	from frame 16 to frame 30, at 25 frames per second
-Attack from frame 30 to frame 40, at 20 frames per second
After loading the mesh and creating the node, add this code:
	s32 standAnim  = myNode->addAnimation (0, 16, 14);
	s32 walkAnim   = myNode->addAnimation (16, 30, 25);
	s32 attackAnim = myNode->addAnimation (30, 40, 20);
	linkAnimation (attackAnim, standAnim);
When you want to perform an attack, just call:
	setAnimation (attackAnim);
The character will attack once, then loop on the standing animation. Easy like that.
It would also be easy to read and parse a typical animation.cfg that comes along with
a Q3 model.
